/**
*   @file imageADT.h
*   Interface para imageADT.c
* 	Incluye estructuras y typedefs.
*   Fecha de ultima modificacion 06/11/2007.
*/

#ifndef IMAGEADT_H_
#define IMAGEADT_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "../quadTreeADT/quadTreeADT.h"

typedef struct imageCDT * imageADT;

/**
*	\fn openImage
*	Inicializa la imagen. Levanta la informacion de un archivo y la mantiene en memoria.
*   @param file Archivo .bmp de donde se levanta todo.
*   @return imageADT puntero al CDT si todo esta bien, NULL en caso contrario.
*/
imageADT openImage(char * file);

/**
*	\fn saveImage
*	Salva la imagen en un archivo.
* 	@param image imageADT creado por openImage.
*   @param file Archivo .bmp de donde se levanta todo. 
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int saveImage(imageADT image, char * file);

/**
*	\fn closeImage
*	Libera toda la informacion en memoria de la imagen pasada como parametro.
* 	@param image imageADT creado por openImage.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int closeImage(imageADT image);

/**
*	\fn printHeader
*	Imprime el primer header del archivo.
* 	@param image imageADT creado por openImage.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int printHeader(imageADT image);

/**
*	\fn printInfo
*	Imprime el segundo header del archivo.
* 	@param image imageADT creado por openImage.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int printInfo(imageADT image);

/**
*	\fn headerCheck
*	Verifica si la informacion levantada de los headers del archivo estan bien.
* 	@param image imageADT creado por openImage.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int headerCheck(imageADT image);

/**
*	\fn mirror
*	Espeja la imagen horizontal y verticalmente segun el parametro orientation.
* 	@param image imageADT creado por openImage.
* 	@param orientation Entero que determina para donde espejar.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int mirror(imageADT image, int orientation);

/**
*	\fn intersection
*	Realiza la interseccion de dos imagenes dejando el resultado en la imagen 1.
* 	El color a usar para la interseccion se pasa por parametro.
* 	@param image imageADT creado por openImage.
* 	@param image2 imageADT creado por openImage.
* 	@param red Color rojo del RGB del color a usar.
* 	@param green Color verde del RGB del color a usar.
* 	@param blue Color azul del RGB del color a usar.  
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int intersection(imageADT image1, imageADT image2,
	unsigned char red, unsigned char green, unsigned char blue);
	

/**
*	\fn rotation
*	Rota la imagen la imagen de manera horario o antihorario
* 	dependiendo del parametro orientation.
* 	@param image imageADT creado por openImage.
* 	@param orientation Entero que determina para donde rotar.
*   @return 1 si todo esta bien, 0 en caso contrario.  
*/
int rotation(imageADT image, int orientation);

/**
*	\fn composition
*	Realiza la composicion de la imagen. Imprime los pixeles de la imagen.
* 	@param image imageADT creado por openImage.
*   @return 1 si todo esta bien, 0 en caso contrario.  
*/
int composition(imageADT image);

#endif /*IMAGEADT_H_*/
